package com.bestcem.xm.user.service;

import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.component.security.dto.TokenDTO;
import com.bestcem.xm.user.controller.vo.group.CreateGroupResponseVO;
import com.bestcem.xm.user.entity.pojo.UserGroupDO;
import com.bestcem.xm.user.entity.pojo.UserGroupLevelDO;
import com.bestcem.xm.user.grpc.service.param.*;
import com.bestcem.xm.user.service.dto.PageResponseDTO;
import com.bestcem.xm.user.service.dto.group.*;

import java.util.*;

/**
 * 用户组服务·
 *
 * @author qiongyu.cui <qiongyu.cui@idiaoyan.com>
 * @version v1.0
 * @date 2021/12/29 10:59
 */
public interface UserGroupService {

    /**
     * 更新用户组状态
     *
     * @param groupId     用户组id
     * @param groupStatus 用户组状态
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean> 更新结果：true：成功、false：失败
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 14:44
     */
    ServiceResult<Boolean> updateStatusById(String groupId, Integer groupStatus);

    /**
     * 根据groupLevelId和groupIdList查询用户组列表
     *
     * @param levelId
     * @param groupIdList
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.group.UserGroupDTO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/9 20:39
     */
    ServiceResult<List<UserGroupDTO>> listByLevelIdAndGroupIds(String levelId, List<String> groupIdList);

    /**
     * 根据指定参数查询用户组列表信息
     *
     * @param userGroupDto 相关参数检索信息
     * @param pageSize     页大小
     * @param currentPage  第一页
     * @return 用户组列表
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 14:45
     */
    ServiceResult<PageResponseDTO<UserGroupDTO>> listPage(GroupListRequestDto userGroupDto, Integer pageSize, Integer currentPage);

    /**
     * 根据分页条件查询相关数据
     *
     * @param userGroupDto 相关参数检索信息
     * @param pageSize     页大小
     * @param currentPage  第一页
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/01/25 18:45
     */
    ServiceResult<List<UserGroupDTO>> findByPage(GroupListRequestDto userGroupDto, Integer pageSize, Integer currentPage);

    /**
     * 校验用户组编码是否可用
     *
     * @param groupCode 用户组编码
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 14:45
     */
    ServiceResult<Boolean> checkGroupCode(String groupCode, String orgId);

    /**
     * 用户组失效
     *
     * @param orgId   组织id
     * @param groupId 用户组id
     * @param vesion  用户组当前版本号
     * @param userId  操作的用户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 14:34
     */
    ServiceResult<Integer> invalidUserGroup(String orgId, String groupId, Integer vesion, String userId);

    /**
     * 移除或者添加某个用户组下的用户信息
     *
     * @param orgId     组织id
     * @param groupCode 用户组id
     * @param userIds   添加的用户id列表
     * @param type      操作类型
     * @param userId    操作的用户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 14:37
     */
    ServiceResult<Integer> handleUsers(String orgId, String groupCode, List<String> userIds, Integer type, String userId);

    /**
     * 查询某个组织的根组织信息
     *
     * @param orgId 组织id
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 16:54
     */
    ServiceResult<UserGroupDTO> getRootGroupByOrgId(String orgId);

    /**
     * 根据组织id查询用户组列表
     *
     * @param orgId 组织id
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/01/04 11:47
     */
    ServiceResult<List<UserGroupDTO>> listByOrgId(String orgId);

    /**
     * 根据组织id查询所有门店
     *
     * @param orgId     组织id
     * @param sortList  排序字段
     * @param pageParam 分页参数
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/1/21 11:21
     */
    ServiceResult<List<UserGroupDTO>> getGroupsByOrgId(String orgId, ArrayList<SortParam> sortList, PageParam pageParam);

    /**
     * 根据组织id查询门店数量
     *
     * @param orgId 组织id
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/1/21 11:21
     */
    ServiceResult<Integer> getGroupCountByOrgId(String orgId);

    /**
     * 通过条件查询公司组织集合
     *
     * @param userGroupDTO 组织对象: orgId 公司id 必传
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/1/21 16:00
     */
    ServiceResult<List<UserGroupDTO>> listByCondition(UserGroupDTO userGroupDTO);

    /**
     * 通过条件查询公司组织集合
     *
     * @param userGroupDTO GroupLevelId必传
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.group.UserGroupDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/9 20:12
     */
    ServiceResult<List<UserGroupDTO>> listBySelective(UserGroupDTO userGroupDTO);

    /**
     * 根据用户组id查询用户组信息
     *
     * @param groupId 用户组id
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/01/24 10:36
     */
    ServiceResult<UserGroupDTO> getById(String groupId);

    /**
     * 获取当前层级的父级
     * XM.apps_mysql.user.v2.group_utils.get_group_ancestors_by_group_id
     *
     * @param groupId
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/13 20:12
     */
    ServiceResult<List<String>> getGroupAncestorsByGroupId(String groupId);

    /**
     * 根据公司id和组织编码查询用户组信息
     *
     * @param orgId     组织Id
     * @param groupCode 组织编码
     * @return UserGroupDTO
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/01/24 10:36
     */
    ServiceResult<UserGroupDTO> getByOrgIdAndGroupCode(String orgId, String groupCode);

    /**
     * 根据公司id和组织编码列表查询用户组信息列表
     *
     * @param orgId      组织Id
     * @param groupCodes 组织编码
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/23 19:08
     */
    ServiceResult<List<UserGroupDTO>> getByOrgIdAndGroupCodes(String orgId, Set<String> groupCodes);

    /**
     * 根据租户id和组织id列表查询组织信息列表
     *
     * @param orgId        租户id
     * @param groupIdsList 组织id列表
     * @return java.util.List<com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/01/24 13:51
     */
    ServiceResult<List<UserGroupDTO>> getGroupsByOrgIdAndGroupIds(String orgId, List<String> groupIdsList);

    /**
     * 获取指定用户组以及所有子用户组
     *
     * @param groupIdsList 组织id列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/1/25 14:52
     */
    ServiceResult<List<UserGroupDTO>> getChildrenByGroupIds(List<String> groupIdsList);

    /**
     * 批量插入组织信息
     *
     * @param userGroups 组织信息列表
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/01/26 16:39
     */
    ServiceResult<Boolean> insertBatch(List<UserGroupDTO> userGroups);

    /**
     * 根据组织id查询当前组织及其所有的父组织列表基础信息
     *
     * @param groupId 当前的组织id
     * @return java.util.List<com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/01/26 16:00
     */
    ServiceResult<List<UserGroupDTO>> getSelfAndParents(String groupId);

    /**
     * 通过根组织id获取组织树的版本号
     *
     * @param rootGroupId 当前根组织id
     * @return versionId 组织树的版本号
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/01/25 11:00
     */
    ServiceResult<Integer> getGroupTreeVersion(String rootGroupId);

    /**
     * 根据user_id获取用户组id列表
     *
     * @param userId 用户Id
     * @return 用户组Id列表
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/01/24 11:20
     */
    ServiceResult<HashSet<String>> getGroupIdsByUserId(String userId);

    /**
     * 搜索用户组列表
     *
     * @param param 组织参数
     * @return com.bestcem.xm.user.service.dto.group.PageDTO<com.bestcem.xm.user.entity.mysql.UserGroup>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 18:51
     */
    PageResponseDTO<UserGroupDTO> listUserGroups(UserGroupListParam param);

    /**
     * 根据用户组id列表获取指定层级上关联的用户组信息
     *
     * @param param:
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/1/25 16:52
     */
    ListRelateGroupsDTO listRelateGroups(ListRelateGroupsParam param);

    /**
     * 根据组织id列表查询当前组以及所有子组信息
     *
     * @param param:
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/1/26 16:27
     */
    ListSubGroupsDTO getSubGroupsByGroupIds(ListSubGroupsByGroupIdsParam param);

    /**
     * 获取指定用户组以及所有子用户组
     *
     * @param rootGroupId     组织id
     * @param includeInactive 是否包含失效状态
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/1/29 14:09
     */
    ServiceResult<List<UserGroupDTO>> getSelfAndChildrenByGroupId(String rootGroupId, boolean includeInactive);

    /**
     * 获取指定用户组以及所有子用户组数量
     *
     * @param groupId         组织id
     * @param includeInactive 是否包含失效状态
     * @return void
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/15 14:03
     */
    ServiceResult<Integer> getSelfAndChildrenCountByGroupId(String groupId, boolean includeInactive);

    /**
     * 根据公司id获取公司的用户组列表
     *
     * @param param 租户id、父组织id、分页、排序、状态
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/7 16:33
     */
    ServiceResult<List<UserGroupDTO>> userGroupListByOrgId(OrgStatusPageParam param);

    /**
     * 根据公司id获取公司的用户组数量
     *
     * @param param 租户id、父组织id、分页、排序、状态
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/22 19:59
     */
    ServiceResult<Long> userGroupCountByOrgId(OrgStatusPageParam param);

    /**
     * 根据父组织id获取公司的用户组列表
     *
     * @param param 租户id、父组织id、分页、排序、状态
     * @return void
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/7 16:34
     */
    ServiceResult<PageResponseDTO<UserGroupDTO>> userGroupListByParentGroupId(OrgStatusPageParam param);

    /**
     * 根据父组织id获取公司的用户组数量
     *
     * @param param 租户id、父组织id、分页、排序、状态
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/22 19:59
     */
    ServiceResult<Integer> userGroupCountByParentGroupId(OrgStatusPageParam param);

    /**
     * 根据用户组id列表获取指定层级上的子用户组数量
     *
     * @param groupLevelId 层级id
     * @param groupIdsList 组织id列表
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Long>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/07 09:51
     */
    ServiceResult<Long> countSubRelate(String groupLevelId, List<String> groupIdsList);

    /**
     * 根据用户组id列表分页获取指定层级上的子用户列表
     *
     * @param groupLevelId 层级id
     * @param groupIdsList 组织id列表
     * @param pageSize     每页大小
     * @param currentPage  第几页
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/07 09:56
     */
    ServiceResult<List<UserGroupDTO>> listPageSubRelate(String groupLevelId, List<String> groupIdsList, Integer pageSize, Integer currentPage);

    /**
     * 恢复失效组织
     *
     * @param userGroupDTO 失效组织信息
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/1/29 10:30
     */
    ServiceResult<GroupInfoDTO> resumeUserGroup(UserGroupDTO userGroupDTO);

    /**
     * 通过组织id和版本号更新组织
     *
     * @param versionId 历史版本号
     * @param groupDTO  组织更新参数
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/2/7 15:30
     */
    ServiceResult<Integer> updateByIdAndVersion(Integer versionId, UserGroupDTO groupDTO);

    /**
     * 通过组织id和版本号更新组织(考虑空的情况)
     *
     * @param versionId 历史版本号
     * @param groupDTO  组织更新参数
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/2/7 15:30
     */
    ServiceResult<Integer> updateByIdAndVersionWithNull(Integer versionId, UserGroupDTO groupDTO);

    /**
     * 通过组织id和公司id查询组织
     *
     * @param groupId 组织id
     * @param orgId   公司id
     * @return ServiceResult<UserGroupDTO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/4/7 10:00
     */
    ServiceResult<UserGroupDTO> getByIdAndOrgId(String groupId, String orgId);

    /**
     * 分页分层查询组织信息
     *
     * @param parentGroupId 父组织id
     * @param orgId         租户id
     * @param userId        用户id
     * @param isAdmin       是否是管理员，管理员能看到所有组织
     * @param page          当前页
     * @param size          每页大小
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.group.service.dto.group.PageDTO < com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/08 11:26
     */
    ServiceResult<PageResponseDTO<UserGroupDTO>> layeredPage(String parentGroupId, String orgId, String userId, boolean isAdmin, Integer page, Integer size);

    /**
     * 获取组织树
     *
     * @param orgId  租户id
     * @param userId 用户id，可为空
     * @param admin  是否是管理员
     * @param all    是否全部展示，false则只展示userId用户绑定的组织及其上下级
     * @return tree of group
     */
    ServiceResult<GroupTreeDTO> getGroupTree(String orgId, String userId, boolean admin, boolean all);

    /**
     * 根据组织id查询本身以及所有父组织信息
     *
     * @param groupId 组织id
     * @param userId
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/08 11:28
     */
    ServiceResult<List<UserGroupDTO>> getUserGroupUpper(String groupId, String userId, boolean isAdmin);

    /**
     * 新增组织
     *
     * @param userGroup （参数可选）
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/10 17:54
     */
    ServiceResult<String> insertSelect(UserGroupDTO userGroup);

    /**
     * 编辑组织/重命名
     *
     * @param groupDTO 编辑组织参数
     * @return com.bestcem.xm.util.XmResultJson<java.lang.Object>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 15:15
     */
    ServiceResult<Integer> updateUserGroup(UpdateUserGroupDTO groupDTO);

    /**
     * 移动组织
     *
     * @param groupDTO 移动数字参数
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/2/8 16:15
     */
    ServiceResult<Integer> moveUserGroup(MoveUserGroupDTO groupDTO);

    /**
     * 生成组织编码
     *
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/9 18:19
     */
    ServiceResult<String> generateGroupCode();

    /**
     * 添加隐藏节点
     *
     * @param groupId 组织id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 16:47
     */
    ServiceResult<Boolean> saveHiddenGroup(String groupId);


    /**
     * 添加层级所添加的隐藏节点
     *
     * @param orgId
     * @param upperLevelId
     * @param lowerLevelId
     * @param newLevelId
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/21 16:05
     */
    ServiceResult<Boolean> saveHiddenGroupForLevel(String orgId, String upperLevelId, String lowerLevelId, String newLevelId);

    /**
     * 根据父组织id获取子组织的最大order
     *
     * @param groupId 父组织id
     * @return java.lang.Integer
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/5 18:56
     */
    Integer getMaxChildrenOrderByGroupId(String groupId);

    /**
     * 新增隐藏节点
     *
     * @param parentGroup     父组织
     * @param userId          当前登录用户
     * @param requestLevelNum 子组织所在层级数
     * @return com.bestcem.xm.user.service.dto.group.UserGroupDTO
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/4/27 16:33
     */
    UserGroupDO createHiddenGroup(UserGroupDO parentGroup, String userId, Integer requestLevelNum, List<UserGroupLevelDO> levels);

    /**
     * 添加子组织
     *
     * @param dto          子组织相关参数
     * @param currentToken token信息
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/10 11:30
     */
    ServiceResult<CreateGroupResponseVO> createSubGroup(UserGroupDTO dto, TokenDTO currentToken);

    /**
     * 设置组织负责人
     *
     * @param dto 可选参数
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Object>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/10 18:09
     */
    ServiceResult<Integer> setAdminId(UserGroupDTO dto);

    /**
     * 根据用户id获取组织列表
     *
     * @param param 根据用户id获取组织列表参数
     * @return com.bestcem.xm.user.service.dto.group.PageDTO<com.bestcem.xm.user.service.dto.group.UserGroupDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 16:48
     */
    PageResponseDTO<UserGroupDTO> getGroupListByUserId(UserGroupListByUserIdParam param);

    /**
     * 查询指定状态下的用户组列表
     *
     * @param dto pageSize 页面大小 currentPage 当前页
     * @return ServiceResult<PageDTO < UserGroupDTO>>
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/02/08 20:38
     */
    ServiceResult<PageResponseDTO<UserGroupResumeDTO>> listPages(GroupsListRequestDTO dto, String orgId, String userId, boolean isAdmin, Integer page, Integer size);

    /**
     * 根据org_id 获取组织结构，控制是否分页
     *
     * @param page 查询参数
     * @return java.util.List<com.bestcem.xm.user.service.dto.group.UserGroupDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 19:07
     */
    List<UserGroupDTO> listByOrgIdOrPage(GetGroupsByOrgIdOrPage page);

    /**
     * 根据指定用户组id和层级id 分页查询指定层级上的子用户组列表
     *
     * @param groupId         组织id
     * @param groupLevelId    层级id
     * @param includeInactive 是否包含失效节点
     * @param currentPage     第几页
     * @param pageSize        每页大小
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.group.service.dto.group.PageDTO < com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/24 11:56
     */
    ServiceResult<PageResponseDTO<UserGroupDTO>> pageChildrenByGroupIdAndLevelId(String groupId, String groupLevelId,
                                                                                 boolean includeInactive, int currentPage, int pageSize);

    /**
     * 根据根据user_id获取祖先层级(包含用户所在层级)ids
     *
     * @param userId 用户Id
     * @return List<String>
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/02/24 17:30
     */
    ServiceResult<List<String>> getSelfAndParentIds(String userId);

    /**
     * 根据根据user_id获取祖先层级(包含用户所在层级)ids
     *
     * @param userId 用户Id
     * @return List<String>
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/02/24 17:30
     */
    ServiceResult<List<String>> getSelfAndParentIdsOrder(String userId);

    /**
     * 递归获取孩子节点
     *
     * @param node:
     * @param includeInactive:
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/2/28 16:54
     */
    void setGroupTree(GroupNodeDTO node, boolean includeInactive);

    /**
     * 根据userId获取用户所在当前组及子组的组织id
     *
     * @param orgId  公司id
     * @param userId 用户id
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 18:01
     */
    ServiceResult<List<String>> getChildrenGroupIdsByUserId(String orgId, String userId);


    /**
     * 根据userId获取用户所在当前组及子组的组织id
     *
     * @param userGroupDO
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 18:01
     */
    ServiceResult<UserGroupDO> getUserGroupByCondition(UserGroupDO userGroupDO);

    /**
     * 联表查询ds_user_group
     *
     * @param userId 用户id
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.entity.pojo.UserGroupDO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/4/29 2:45
     */
    ServiceResult<List<UserGroupDTO>> getGroupsByUserIdLeftJoinGroup(String userId);

    /**
     * 根据组织Id列表获取组织
     *
     * @param groupIds 组织id列表
     * @return List<UserGroupDTO>
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/05/11 10:27
     */
    ServiceResult<List<UserGroupDTO>> listByGroupIds(List<String> groupIds);

    /**
     * 根据组织id列表和状态查询组列表信息
     *
     * @param groupIds 组织id列表
     * @param status   状态
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.group.UserGroupDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/08 17:13
     */
    ServiceResult<List<UserGroupDTO>> listByGroupIdsAndStatus(List<String> groupIds, Integer status);

    /**
     * 根据组织code获取组织列表
     *
     * @param orgId          公司id
     * @param groupCodesList 组织编码列表
     * @param statusList     组织状态列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.group.UserGroupDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/5/17 15:52
     */
    ServiceResult<List<UserGroupDTO>> listGroupsByCodes(String orgId, List<String> groupCodesList, List<Integer> statusList);

    /**
     * 获取指定组在指定层级上的子组织关联的用户数总和
     *
     * @param groupId      组织id
     * @param groupLevelId 层级id
     * @param orgId        租户id
     * @param userId       当前用户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Long>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/27 19:15
     */
    ServiceResult<Long> getUserNum(String groupId, String groupLevelId, String orgId, String userId);

    /**
     * 根据组织id列表查询所有的子组织+根据组织id列表和层级id查询对应的组织列表
     *
     * @param groupIds 组织id列表
     * @param levelId  层级id
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.group.UserGroupDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/04 13:49
     */
    ServiceResult<List<UserGroupDTO>> listSubGroups(List<String> groupIds, String levelId);


    /**
     * 支持模糊搜索用户组列表
     *
     * @param searchGroupsParam
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.group.UserGroupDTO>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/05 21:01
     */
    ServiceResult<PageResponseDTO<UserGroupDTO>> searchGroups(SearchGroupsParam searchGroupsParam);


    ServiceResult<List<UserGroupDTO>> listGroupsByIds(List<String> groupIds);

    ServiceResult<String> saveGroupAndLevel(List<UserGroupLevelDTO> levelDTOS,
                                            List<UserGroupImportDTO> importDTOS, TokenDTO tokenDTO);

    UserGroupDTO buildRootGroupParam(UserGroupImportDTO rootImportGroup, TokenDTO tokenDTO, Date now, String storeLevelId);

    void buildParamByLayer(UserGroupDTO parentGroup, String parentFullGroupName, String storeLevelId);

    UserGroupDTO buildGroupParam(UserGroupDTO parentGroup, UserGroupImportDTO importGroup, int groupOrder, String storeLevelId);

    List<UserGroupDTO> getSeqAndOrgId(Integer offset, Integer size);

    /**
     * 处理层级删除后的组织数据
     *
     * @param orgId   公司id
     * @param levelId 组织id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 16:47
     */
    ServiceResult<Boolean> handleDeleteLevelGroup(String orgId, String levelId);

    List<UserGroupDTO> listByOrgIdAndStatuses(String orgId);

    /**
     * 批量删除失效节点
     *
     * @param userId
     * @param groupIdList
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/08/03 15:58
     */
    ServiceResult<Integer> deleteInvalidGroup(String userId, List<String> groupIdList);

    /**
     * 获取该组织下所有子孙组织id列表
     *
     * @param orgId   orgId
     * @param groupId groupId
     * @param page
     * @param size
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2022/8/19 11:37
     */
    ServiceResult<PageResponseDTO<String>> listSubGroupIdsByGroupId(String orgId, String groupId, int page, int size);

    /**
     * 递归获取父节点并排序
     *
     * @param groupId
     * @param parentIdList
     * @return java.util.List<java.lang.String>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/08/25 19:25
     */
    List<String> getGroupParentIds(String groupId, List<String> parentIdList);

    ServiceResult<GroupOldAllTreeDTO> getOldGroupTree(String orgId, String userId, boolean admin);

    /**
     * 获取用户所在组ID，如果用户属于多个层级树，则返回每个层级树中所在组的ID
     *
     * @param userId           用户ID
     * @param root_group_id
     * @param is_filter_status
     * @return 所在组ID的数组
     */
    List<String> getUserGroupIds(String userId, String root_group_id, boolean is_filter_status);

    Boolean groupCodeEditable(String id);

    ServiceResult<?> groupUser(String id, Integer page, Integer rowsPerPage, Integer returnCount);

    ServiceResult<?> userGroup(boolean onlyValidate, Integer page, Integer rowsPerPage, Integer status, String search);

    Boolean groupCodeCheck(String id, String code);
}
